<ol>
	<li>
	<h2>�ȸ�t-io�������</h2>

	<p><strong>t-io</strong>�ǻ���jdk aioʵ�ֵ���ѧ���á��ȶ��Ͳ١�����ǿ�������ù��ܷḻ�����Ĵ���ֻ��3000���еļ�ʱͨѶ��ܡ���ĸ<strong>&nbsp;t&nbsp;</strong>ȡ<strong>talent</strong>����ţ�������ĸ��Ҳ��������Ϊ<strong>&quot;�ؿ�&quot;</strong>��ͬʱҲ��<strong>��������</strong>������ĸ��һЩ������</p>

	<ul>
		<li><a href="http://www.t-io.org:9292/" target="_blank">�� ��</a></li>
		<li>��Դ�й���¼��ַ��<a href="https://www.oschina.net/p/t-io" target="_blank">https://www.oschina.net/p/t-io</a></li>
		<li>���Ƶ�ַ��<a href="https://git.oschina.net/tywo45/t-io/" target="_blank">https://git.oschina.net/tywo45/t-io/</a></li>
		<li><a href="http://www.t-io.org:9292/apidocs/index.html" target="_blank">API</a>���ȿ�<a href="http://www.t-io.org:9292/apidocs/org/tio/core/Aio.html" target="_blank">Aio.java</a>�ľͺã�Ȼ��Ϳ���ϵ�в��Ͱɣ�</li>
		<li><a href="https://my.oschina.net/talenttan/blog/863545" target="_blank">���ϼ��������</a></li>
	</ul>

	<p>���������ʽ����</p>
	</li>
	<li>
	<h2>��ʾ�������</h2>

	<p>��������ʾ����һ�����͵�TCP������Ӧ�ã�����λ��example/helloworldĿ¼�С�</p>

	<ul>
		<li>����˺Ϳͻ��˵���ϢЭ��Ƚϼ򵥣���ϢͷΪ4���ֽڣ����Ա�ʾ��Ϣ��ĳ��ȣ���Ϣ��Ϊһ���ַ�����byte[]</li>
		<li>�����������������6789�˿�</li>
		<li>�ͻ������ӵ�����˺󣬻����������������һ����Ϣ</li>
		<li>�������յ���Ϣ����Ӧһ����Ϣ</li>
		<li>֮�󣬿�ܲ���Զ��ӿͻ��˷���������������������Ҳ����������û�г�ʱ</li>
		<li>��ܲ���ڶ������Զ�������<strong>��t-io��˵��ֻ���һ�д����ӵ���Զ���������</strong>��</li>
	</ul>
	</li>
	<li>
	<h2>����ģ�����</h2>

	<ul>
		<li>
		<h3>��������</h3>
		</li>
	</ul>

	<pre>
<code class="language-xml">&lt;dependency&gt;
    &lt;groupId&gt;org.t-io&lt;/groupId&gt;
    &lt;artifactId&gt;tio-core&lt;/artifactId&gt;
    &lt;version&gt;1.6.9.v20170408-RELEASE&lt;/version&gt;
&lt;/dependency&gt;</code></pre>

	<ul>
		<li>
		<h3>����ҵ����Ϣ���ṹ</h3>
		</li>
	</ul>

	<p>ע����ʱ��������Ϳͻ��˵�ҵ����Ϣ���ṹ��һ������������£���Ϣ���Ķ���Ͳ�Ҫ���ڹ���ģ��</p>

	<pre>
<code class="language-java">public class HelloPacket extends Packet
{
    public static final int HEADER_LENGHT = 4;//��Ϣͷ�ĳ���
    public static final String CHARSET = "utf-8";
    private byte[] body;
 
    /**
     * @return the body
     */
    public byte[] getBody()
    {
        return body;
    }
 
    /**
     * @param body the body to set
     */
    public void setBody(byte[] body)
    {
        this.body = body;
    }
}
           </code></pre>

	<ul>
		<li>
		<h3>ʵ��ioͨѶ�бز����ٵı���ͽ���</h3>
		</li>
	</ul>

	<p>ע����ʱ��������˺Ϳͻ��˵ı�������㷨��һ�������ʱ��Ͳ�Ҫ�Թ���ģ������ɱ���ͽ���Ĵ��룬���Ƿֱ���ڷ������˺Ϳͻ�����ɡ�</p>

	<pre>
<code class="language-java">/**
 * hello world���з������˺Ϳͻ��˵ı�������㷨��һ���ģ����Գ���һ�������ĸ������
 * @author tanyaowu 
 *
 */
public abstract class HelloAbsAioHandler implements AioHandler&lt;Object, HelloPacket, Object&gt;
{
    /**
     * ���룺��ҵ����Ϣ������Ϊ���Է��͵�ByteBuffer
     * �ܵ���Ϣ�ṹ����Ϣͷ + ��Ϣ��
     * ��Ϣͷ�ṹ��    4���ֽڣ��洢��Ϣ��ĳ���
     * ��Ϣ��ṹ��   �����json����byte[]
     */
    @Override
    public ByteBuffer encode(HelloPacket packet, GroupContext&lt;Object, HelloPacket, Object&gt; groupContext, ChannelContext&lt;Object, HelloPacket, Object&gt; channelContext)
    {
        byte[] body = packet.getBody();
        int bodyLen = 0;
        if (body != null)
        {
            bodyLen = body.length;
        }
 
        //bytebuffer���ܳ����� = ��Ϣͷ�ĳ��� + ��Ϣ��ĳ���
        int allLen = HelloPacket.HEADER_LENGHT + bodyLen;
        //����һ���µ�bytebuffer
        ByteBuffer buffer = ByteBuffer.allocate(allLen);
        //�����ֽ���
        buffer.order(groupContext.getByteOrder());
 
        //д����Ϣͷ----��Ϣͷ�����ݾ�����Ϣ��ĳ���
        buffer.putInt(bodyLen);
 
        //д����Ϣ��
        if (body != null)
        {
            buffer.put(body);
        }
        return buffer;
    }
 
    /**
     * ���룺�ѽ��յ���ByteBuffer�������Ӧ�ÿ���ʶ���ҵ����Ϣ��
     * �ܵ���Ϣ�ṹ����Ϣͷ + ��Ϣ��
     * ��Ϣͷ�ṹ��    4���ֽڣ��洢��Ϣ��ĳ���
     * ��Ϣ��ṹ��   �����json����byte[]
     */
    @Override
    public HelloPacket decode(ByteBuffer buffer, ChannelContext&lt;Object, HelloPacket, Object&gt; channelContext) throws AioDecodeException
    {
        int readableLength = buffer.limit() - buffer.position();
        //�յ��������鲻��ҵ������򷵻�null�Ը��߿�����ݲ���
        if (readableLength &lt; HelloPacket.HEADER_LENGHT)
        {
            return null;
        }
 
        //��ȡ��Ϣ��ĳ���
        int bodyLength = buffer.getInt();
 
        //���ݲ���ȷ�����׳�AioDecodeException�쳣
        if (bodyLength &lt; 0)
        {
            throw new AioDecodeException("bodyLength [" + bodyLength + "] is not right, remote:" + channelContext.getClientNode());
        }
 
        //���㱾����Ҫ�����ݳ���
        int neededLength = HelloPacket.HEADER_LENGHT + bodyLength;
        //�յ��������Ƿ��㹻���
        int isDataEnough = readableLength - neededLength;
        // ������Ϣ�峤��(ʣ�µ�buffe�鲻����Ϣ��)
        if (isDataEnough &lt; 0)
        {
            return null;
        } else  //����ɹ�
        {
            HelloPacket imPacket = new HelloPacket();
            if (bodyLength &gt; 0)
            {
                byte[] dst = new byte[bodyLength];
                buffer.get(dst);
                imPacket.setBody(dst);
            }
            return imPacket;
        }
    }
}</code></pre>

	<ul>
		<li>
		<h3>����һ��˫��Լ���Ķ˿�</h3>
		</li>
	</ul>

	<pre>
<code class="language-java">public interface Const
{
    public static final int PORT = 6789;
}</code></pre>
	</li>
	<li>
	<h2>����˴���</h2>

	<ul>
		<li>
		<h3>ʵ��AioHandler</h3>
		</li>
	</ul>

	<p>ע���˴��̳���HelloAbsAioHandler�������Ѿ���ɱ���ͽ���Ĺ���</p>

	<pre>
<code class="language-java">public class HelloServerAioHandler extends HelloAbsAioHandler implements ServerAioHandler&lt;Object, HelloPacket, Object&gt;
{
    /** 
     * ������Ϣ
     */
    @Override
    public Object handler(HelloPacket packet, ChannelContext&lt;Object, HelloPacket, Object&gt; channelContext) throws Exception
    {
        byte[] body = packet.getBody();
        if (body != null)
        {
            String str = new String(body, HelloPacket.CHARSET);
            System.out.println("�յ���Ϣ��" + str);
 
            HelloPacket resppacket = new HelloPacket();
            resppacket.setBody(("�յ��������Ϣ�������Ϣ��:" + str).getBytes(HelloPacket.CHARSET));
            Aio.send(channelContext, resppacket);
        }
        return null;
    }
}</code></pre>

	<ul>
		<li>
		<h3>��������</h3>
		</li>
	</ul>

	<pre>
<code class="language-java">public class HelloServerStarter
{
    //handler, �������롢���롢��Ϣ����
    public static ServerAioHandler&lt;Object, HelloPacket, Object&gt; aioHandler = new HelloServerAioHandler();
     
    //�¼�������������Ϊnull���������Լ�ʵ�ָýӿڣ����Բο�showcase�˽�Щ�ӿ�
    public static ServerAioListener&lt;Object, HelloPacket, Object&gt; aioListener = null;
     
    //һ�����ӹ��õ������Ķ���
    public static ServerGroupContext&lt;Object, HelloPacket, Object&gt; serverGroupContext = new ServerGroupContext&lt;&gt;(aioHandler, aioListener);
     
    //aioServer����
    public static AioServer&lt;Object, HelloPacket, Object&gt; aioServer = new AioServer&lt;&gt;(serverGroupContext);
     
    //��ʱ����Ҫ��ip������Ҫ��null
    public static String serverIp = null;
     
    //�����Ķ˿�
    public static int serverPort = Const.PORT;
 
    /**
     * �����������
     */
    public static void main(String[] args) throws IOException
    {
        aioServer.start(serverIp, serverPort);
    }
}</code></pre>
	</li>
	<li>
	<h2>�ͻ��˴���</h2>

	<ul>
		<li>
		<h3>ʵ��AioHandler</h3>
		</li>
	</ul>

	<p>ע���˴��̳���HelloAbsAioHandler�������Ѿ���ɱ���ͽ���Ĺ���</p>

	<pre>
<code class="language-java">public class HelloClientAioHandler extends HelloAbsAioHandler implements ClientAioHandler&lt;Object, HelloPacket, Object&gt;
{
    /** 
     * ������Ϣ
     */
    @Override
    public Object handler(HelloPacket packet, ChannelContext&lt;Object, HelloPacket, Object&gt; channelContext) throws Exception
    {
        byte[] body = packet.getBody();
        if (body != null)
        {
            String str = new String(body, HelloPacket.CHARSET);
            System.out.println("�յ���Ϣ��" + str);
        }
 
        return null;
    }
 
    private static HelloPacket heartbeatPacket = new HelloPacket();
 
    /** 
     * �˷����������null����ܲ����򲻻ᷢ������������ط�null����ܲ���ᶨʱ�����������ص���Ϣ��
     */
    @Override
    public HelloPacket heartbeatPacket()
    {
        return heartbeatPacket;
    }
}</code></pre>

	<ul>
		<li>
		<h3>��������</h3>
		</li>
	</ul>

	<pre>
<code class="language-java">public class HelloClientStarter
{
    //�������ڵ�
    public static Node serverNode = new Node("127.0.0.1", Const.PORT);
 
    //handler, �������롢���롢��Ϣ����
    public static ClientAioHandler&lt;Object, HelloPacket, Object&gt; aioClientHandler = new HelloClientAioHandler();
     
    //�¼�������������Ϊnull���������Լ�ʵ�ָýӿڣ����Բο�showcase�˽�Щ�ӿ�
    public static ClientAioListener&lt;Object, HelloPacket, Object&gt; aioListener = null;
     
    //�������Զ����ӵģ������Զ���������Ϊnull
    private static ReconnConf&lt;Object, HelloPacket, Object&gt; reconnConf = new ReconnConf&lt;Object, HelloPacket, Object&gt;(5000L);
 
    //һ�����ӹ��õ������Ķ���
    public static ClientGroupContext&lt;Object, HelloPacket, Object&gt; clientGroupContext = new ClientGroupContext&lt;&gt;(aioClientHandler, aioListener, reconnConf);
 
    public static AioClient&lt;Object, HelloPacket, Object&gt; aioClient = null;
    public static ClientChannelContext&lt;Object, HelloPacket, Object&gt; clientChannelContext = null;
 
    /**
     * �����������
     */
    public static void main(String[] args) throws Exception
    {
        aioClient = new AioClient&lt;&gt;(clientGroupContext);
        clientChannelContext = aioClient.connect(serverNode);
 
        //���Ϻ󣬷�����Ϣ����
        send();
    }
 
    private static void send() throws Exception
    {
        HelloPacket packet = new HelloPacket();
        packet.setBody("hello world".getBytes(HelloPacket.CHARSET));
        Aio.send(clientChannelContext, packet);
    }
}</code></pre>

	<p>&nbsp;</p>
	</li>
</ol>
